package com.ceadeal.admin.group.wechat.service;

import com.ceadeal.admin.group.wechat.model.Article;
import com.ceadeal.admin.group.wechat.model.resp.NewsMessage;
import com.ceadeal.admin.group.wechat.model.resp.TextMessage;
import com.ceadeal.admin.group.wechat.util.CommonUtil;
import com.ceadeal.admin.group.wechat.util.MessageUtil;
import com.ceadeal.admin.group.wechat.util.UsageUtil;
import com.ceadeal.admin.group.wechat.web.WxEntryController;
import com.ceadeal.admin.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class WxCoreService {
	private static Logger log = LoggerFactory.getLogger(WxEntryController.class);
	private static final String SERVER_ADDR = "http://wx.ceadeal.com";

	@Autowired
	private CloudMusicService cloudMusicService;

	/**
	 * 处理微信发来的请求
	 * @param request
	 * @return
	 */
	@SuppressWarnings("unused")
	public String processRequest(HttpServletRequest request) {
		String respMessage = null;
		try {
			// 默认返回的文本消息内容
			String respContent = "回复“?”显示帮助菜单";

			// xml请求解析
			Map<String, String> requestMap = MessageUtil.parseXml(request);
			String fromUserName = requestMap.get("FromUserName");	// 发送方帐号（open_id）
			String toUserName = requestMap.get("ToUserName");		// 公众帐号
			String msgType = requestMap.get("MsgType");				// 消息类型

			/* TEST */
//			String fromUserName = "FromUserName";	// 发送方帐号（open_id）
//			String toUserName = "ToUserName";		// 公众帐号
//			String msgType = "text";				// 消息类型

			log.info("处理微信发来的请求 => fromUserName:{} | toUserName:{} | msgType:{}", fromUserName, toUserName, msgType);

			// 回复文本消息
			TextMessage textMessage = new TextMessage();
			textMessage.setToUserName(fromUserName);
			textMessage.setFromUserName(toUserName);
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);

			// 文本消息
			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				//respContent = "您发送的是文本消息！";
				// 文本消息内容
				String content = requestMap.get("Content");
				// 判断用户发送的是否是单个QQ表情
				if(CommonUtil.isQqFace(content)) {
					// 用户发什么QQ表情，就返回什么QQ表情
					respContent = content;
				}
				// 回复'?'推送使用
				else if ("?".equals(content) || "？".equals(content)) {
					respContent = UsageUtil.getMainUsage();
				}
				// 回复'0'最新公告
				else if ("0".equals(content)) {
					NewsMessage subscribe = getSubscribe(fromUserName, toUserName);
					return MessageUtil.newsMessageToXml(subscribe);
				}
				// 回复'1'随机音乐
				else if ("1".equals(content)) {
					respContent = "暂停使用";
				}
				// 回复'2'点播音乐
				else if ("2".equals(content)) {
					respContent = UsageUtil.getMusicUsage();
				}
				// 回复内容包含网易云音乐关键字符串
				else if (content.startsWith("http://music.163.com") || (content.startsWith("分享") && content.contains("@网易云音乐"))) {
					// 将歌曲2个字及歌曲后面的+、空格、-等特殊符号去掉
					String keyWord = content.replaceAll("^wyy@[\\+ ~!@#%^-_=]?", "");
					// 如果歌曲名称为空
					if (StringUtil.isEmpty(keyWord)) {
						respContent = UsageUtil.getMusicUsage();
					} else {
						respContent = cloudMusicService.grabChain(keyWord);
					}
				} else {

				}
			}
			// 图片消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
				//respContent = "您发送的是图片消息！";

			}
			// 地理位置消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
				//respContent = "您发送的是地理位置消息！";

			}
			// 链接消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
				//respContent = "您发送的是链接消息！";

			}
			// 音频消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
				//respContent = "您发送的是音频消息！";

			}
			// 事件推送
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
				// 事件类型
				String eventType = requestMap.get("Event");
				// 订阅
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					respContent = UsageUtil.getMainUsage();
				}
				// 取消订阅
				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					// TODO 取消订阅后用户再收不到公众号发送的消息，因此不需要回复消息
				}
				// 自定义菜单点击事件
				else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
					// TODO 自定义菜单权没有开放，暂不处理该类消息
				}
			}

			textMessage.setContent(respContent);
			respMessage = MessageUtil.textMessageToXml(textMessage);

			//log.info("处理微信发来的请求 => respContent:\n{}", respContent);
			log.info("处理微信发来的请求 => respMessage:\n{}", respMessage);
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return respMessage;
	}

	/**
	 * 获取订阅推送消息
	 * @param fromUserName
	 * @param toUserName
	 * @return
	 */
	private static NewsMessage getSubscribe(String fromUserName, String toUserName) {
		NewsMessage subscribe = new NewsMessage(fromUserName, toUserName, MessageUtil.RESP_MESSAGE_TYPE_NEWS);
		List<Article> articleList = new ArrayList<Article>();
		// Article 1
		Article art1 = new Article();
		art1.setTitle("离别是为了和你再一次相遇！");
		art1.setPicUrl(SERVER_ADDR + "/group/wx/image/1.jpg");
		art1.setDescription("离别是为了和你再一次相遇，这次，我回来了！");
		art1.setUrl("http://viewer.maka.im/k/SGZLBY4H");
		articleList.add(art1);
		// Article 2
		Article art2 = new Article();
		art2.setTitle("推广：Zoo Coffee 微官网");
		art2.setPicUrl(SERVER_ADDR + "/group/wx/image/zoo_coffee_logo3.jpg");
		art2.setDescription("推广：Zoo Coffee 微官网");
		art2.setUrl("http://create.maka.im/k/OU3BLPOS");
		articleList.add(art2);
		// Article 3
		Article art3 = new Article();
		art3.setTitle("聆听者微信公众号上线啦！");
		art3.setPicUrl(SERVER_ADDR + "/group/wx/image/qrcode_new.jpg");
		art3.setDescription("聆听者微信公众账号同步上线！");
		art3.setUrl("http://viewer.maka.im/k/MH43OGSU");
		articleList.add(art3);
		subscribe.setArticles(articleList);
		return subscribe;
	}

	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		NewsMessage nm = getSubscribe("1","2");
		String s = MessageUtil.newsMessageToXml(nm);
		System.out.println(s);
	}

}
